package org.dandsoft.blackbox.utils.table;

import org.dandsoft.blackbox.utils.list.ListElement;
import org.dandsoft.blackbox.utils.list.ListElementIterator;

/**
 * @author Vilyuzhanin Denis (Fin)
 */
public class Row {

    private Object data;
    private long rowKey;
    private Cell functionCell;
    private ListElement<Row> rowList = new ListElement<Row>(this);
    private Cell firstArgumentsCell = new Cell();
    private Cell firstResultsCell = new Cell();


    public ListElementIterator<Cell> getArgumentListIterator() {
        ListElementIterator<Cell> iterator = firstArgumentsCell.getRowListIterator();
        iterator.nextRight();
        return iterator;
    }

    /**
     * Подсоединить ячейку с аргументом в ряд
     *
     * @param cell Ячейка которую необходимо подсоединить. Она подсоединяется к ряду.
     */
    public void addArgumentCell(Cell cell) {
        cell.connectToRow(firstArgumentsCell);
    }

    /**
     * Подсоединить ячейку с результатом в ряд
     *
     * @param cell Ячейка которую необходимо подсоединить. Она подсоединяется к ряду.
     */
    public void addResultCell(Cell cell) {
        cell.connectToRow(firstResultsCell);
    }

    public void removeResultCell(Cell cell) {
        if (rowKey == cell.getRowKey()) {
            cell.disconnect();
        }
    }

    public void removeArgumentCell(Cell cell) {
        if (rowKey == cell.getRowKey()) {
            cell.disconnect();
        }
    }

    public ListElement<Row> getRowList() {
        return rowList;
    }

    public Object getData() {
        return data;
    }

    public long getRowKey() {
        return rowKey;
    }

    public void setRowKey(long rowKey) {
        this.rowKey = rowKey;
    }

    public Cell getFunctionCell() {
        return functionCell;
    }

    public void setFunctionCell(Cell functionCell) {
        this.functionCell = functionCell;
    }

    public Cell getFirstArgumentsCell() {
        return firstArgumentsCell;
    }

    public void setFirstArgumentsCell(Cell firstArgumentsCell) {
        this.firstArgumentsCell = firstArgumentsCell;
    }

    public Cell getFirstResultsCell() {
        return firstResultsCell;
    }

    public void setFirstResultsCell(Cell firstResultsCell) {
        this.firstResultsCell = firstResultsCell;
    }
}
